﻿#pragma once
#include "test_c.h" // 包含头文件，如果有 class 则会在头文件中报错，因为 class 不是纯 C 语言的关键字
//#include <iostream>
//#include <vcruntime.h>  // for _vcrt_malloc, _vcrt_free, wchar_t
// C/C++ 学习网站：https://legacy.cplusplus.com 注意旧版本（搜索）和新版本

static const char* const print_str(const wchar_t* const str) // const // err： 不能有 const 修饰
{ // 返回全局常指针变量
    printf("%ws\n", str);
    return "ok";
}

int main()
{
    static const int a = 10; // 全局常变量，类似于全局宏 #define a 10，但不是替换
    //int arr[a]; // C 不支持这种写法

    wchar_t str1[] = L"Hello!";// 宽字符字符串，注意要有 L 前缀，就是 unsigned short 类型
    //const char* str2 = R"(World!\n  你好\t)"; // C 不支持 R 前缀的原生字符串
    print_str(str1); // 打印宽字符字符串

    printf("sizeof(uni) = %zd\n", sizeof(uni)); // 16 结构体大小
    uni ui1 = { 10, 666 }; // 联合体 u1、u2 共用内存空间，只占一个元素位置
    strcpy_s(ui1.u2, 8, "foolish"); // 联合体 u2 赋值
    printf("ui1.u1 = %d, ui1.ui2 = %s, ui1.c = %d\n\n", ui1.u1, ui1.u2, ui1.c);

    printf("sizeof(s0) = %zd, sizeof(s1) = %zd\n", sizeof(s0), sizeof(s1));
    s1 ts1 = { 1.1f, 2.2f, 3.3f, 4.4f }; // 结构体 s1 赋值
    printf("ts1.x = %.2f, ts1.y = %.2f, ts1.z = %.2f, ts1.w = %.2f\n", ts1.x, ts1.y, ts1.z, ts1.w);
    printf("---------------------------------------------------\n");
    s0 ts1_s2 = { 7.7f, 8.8f };
    ts1.s2 = ts1_s2; // 结构体 s2 赋值给结构体 ts1_s2
    printf("ts1.s2.a = %.2f, ts1.s2.b = %.2f\n", ts1.s2.a, ts1.s2.b);
    printf("ts1.x = %.2f, ts1.y = %.2f, ts1.z = %.2f, ts1.w = %.2f\n\n", ts1.x, ts1.y, ts1.z, ts1.w);

    char str2[] = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288";
    char str3[] = "123456789";
    char* endptr;
    double num;
    num = strtod(str2, &endptr); // 使用 strtod 函数将字符串转换为双精度浮点数
    /* strtod 函数的第二个参数是一个二级指针，如果转换失败，则返回 0 */
    if (num) // 检查转换是否成功，会自动四舍五入
        printf("读取的小数是: %.30lf\n", num); // 输出结果，存在精度损失问题
    else
        printf("读取失败n\n");
    num = strtod(str3, &endptr); // 尝试将字符串转换为双精度浮点数
    printf("读取的小数是: %lf\n", num);

    if (sscanf(str2, "%lf", &num) == 1) // 也会四舍五入
        printf("读取的小数加一是: %.80lf\n", num + 1);

    return 0;
}